<?php


namespace App\Http\Common;

use Illuminate\Support\Facades\Validator;

/**
 * 我自定义的验证规则
 * Class MyValidator
 * @package App\Http\Common
 */
class MyValidator
{
    //创建静态私有的变量保存该类对象
    private static $instance;
    //参数
    public $config;
    //防止直接创建对象
    private function __construct($config){
        $this->config = $config;
    }
    //防止克隆对象
    private function __clone(){
    }
    // 使用单列模式
    public static function getInstance($config=null){
        //没有则创建
        if (!self::$instance instanceof self) {
            self::$instance = new self($config);
        }
        return self::$instance;
    }

    /**
     * 注册验证规则
     */
    public function register(){
        $this->registerMobileValidator();
        $this->registerAllIntValidator();
        $this->registerAllMaxValidator();
        $this->registerMyImageValidator();
        $this->registerMyPriceValidator();
        $this->registerMyImageCountValidator();
    }

    /**
     * 手机验证规则
     */
    public function registerMobileValidator(){
        // 手机号码验证规则
        Validator::extend('mobile', function ($attribute, $value, $parameters) {
            return preg_match('/^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147))\d{8}$/', $value);
        });
        // 替换 :values 为文件 \resources\lang\cn\validation.php 的
        Validator::replacer("mobile",function ($message, $attribute, $rule, $parameters, $validator){
            return '电话号码格式不正确';
        });
    }

    /**
     * json所有的 元素 必须为整数
     */
    public function registerAllIntValidator(){
        Validator::extend('all_int', function ($attribute, $value, $parameters) {
            $parseValue = json_decode($value);
            foreach ($parseValue as $k=>$v){
                if (!is_numeric($v)){
                    return false;
                };
            }
            return true;
        });
        // 替换 :values 为文件 \resources\lang\cn\validation.php 的
        Validator::replacer("all_int",function ($message, $attribute, $rule, $parameters, $validator){
            $data = $validator->getData();
            $values = $data[$attribute];
            $parseValue = json_decode($values);
            $temp = '';
            foreach ($parseValue as $k => $v) {
                if (!is_numeric($v)){
                    $temp = $k+1;
                };
            }
            return str_replace(':values',$temp,$message);
        });
    }

    /**
     * json所有的 元素 最大值
     */
    public function registerAllMaxValidator(){
        // json所有的 元素 最大值
        Validator::extend('all_max', function ($attribute, $value, $parameters) {
            $parseValue = json_decode($value);
            foreach ($parseValue as $k => $v) {
                if (strlen($v) > $parameters[0]) {
                    return false;
                };
            }
            return true;
        });
        // 替换
        Validator::replacer("all_max",function ($message, $attribute, $rule, $parameters, $validator){
            $data = $validator->getData();
            $values = $data[$attribute];
            $parseValue = json_decode($values);
            $temp = '';
            foreach ($parseValue as $k => $v) {
                if (strlen($v) > $parameters[0]) {
                    $temp = $k+1;
                };
            }
            return str_replace([':values',':max'],[$temp,$parameters[0]],$message);
        });
    }

    /**
     * 验证是否有图片
     */
    public function registerMyImageValidator(){
        // json所有的 元素 最大值
        Validator::extend('my_image', function ($attribute, $value, $parameters) {
            $parseValue = json_decode($value);
            if (count($parseValue)<$parameters[0]){
                return false;
            }
            return true;
        });
        // 替换
        Validator::replacer("my_image",function ($message, $attribute, $rule, $parameters, $validator){
            $data = $validator->getData();
            $values = $data[$attribute];
            $parseValue = json_decode($values);
            if (count($parseValue)<$parameters[0]){
                if (count($parseValue)<count($parameters)){
                    return str_replace([':values'],[$parameters[count($parseValue)]],$message);
                }else{
                    return str_replace([':values'],[$parameters[0]],$message);
                }
            }
            return $message;
        });
    }

    /**
     * 验证 图片 数量
     */
    public function registerMyImageCountValidator(){
        // json所有的 元素 最大值
        Validator::extend('my_image_count', function ($attribute, $value, $parameters) {
            $parseValue = json_decode($value);
            if (count($parseValue)>$parameters[0]){
                return false;
            }
            return true;
        });
        // 替换
        Validator::replacer("my_image_count",function ($message, $attribute, $rule, $parameters, $validator){
            $data = $validator->getData();
            $values = $data[$attribute];
            $parseValue = json_decode($values);
            if (count($parseValue)>$parameters[0]){
                return str_replace([':values'],[$parameters[0]],$message);
            }
            return $message;
        });
    }

    /**
     * 当价格填了 价格就必须大于0
     */
    public function registerMyPriceValidator(){
        Validator::extend('my_price', function ($attribute, $value, $parameters) {
            if ($parameters[0] == 1){// 传递来的参数 收费为1 免费为2
                if (!$value){
                    return false;
                }
            }
            return true;
        });
    }

}
